package com.wu.dao.impl;

import com.wu.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public abstract class BaseDao {

    //使用Dbutils来操作数据库
    private QueryRunner queryRunner=new QueryRunner();

    /**
     * 执行insert、update、delete
     * @param sql
     * @param args
     * @return 返回-1执行失败
     */
    public int update(String sql,Object ... args)
    {
        Connection conn= JdbcUtils.getConnection();
        try{
            return queryRunner.update(conn,sql,args);
        }catch (SQLException e)
        {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return -1;
    }

    /**
     * 查询一条语句
     * @param type 返回的对象类型
     * @param sql 执行的SQL语句
     * @param args SQL语句的对应参数
     * @param <T> 返回类型的泛型
     * @return 返回null执行失败
     */
    public <T> T queryForOne(Class<T> type,String sql,Object ... args)
    {
        Connection conn=JdbcUtils.getConnection();
        try{
            return queryRunner.query(conn,sql,new BeanHandler<T>(type),args);
        }catch (SQLException e)
        {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return null;
    }

    /**
     * 查询多条语句
     * @param type
     * @param sql
     * @param args
     * @param <T>
     * @return 返回null执行失败
     */
    public <T> List<T> queryForList(Class<T> type,String sql,Object ...args)
    {
        Connection conn=JdbcUtils.getConnection();
        try{
            return queryRunner.query(conn,sql,new BeanListHandler<T>(type),args);
        }catch(SQLException e)
        {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return null;
    }
    /**
     * 查询多条语句
     * @param type
     * @param sql
     * @param <T>
     * @return 返回null执行失败
     */
    public <T> List<T> queryForList(Class<T> type,String sql)
    {
        Connection conn=JdbcUtils.getConnection();
        try{
            return queryRunner.query(conn,sql,new BeanListHandler<T>(type));
        }catch(SQLException e)
        {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return null;
    }

    /**
     * 返回一行一列的sql语句
     * @param sql 执行的SQL语句
     * @param args SQL语句对应的参数
     * @return
     */
    public Object queryForStringValue(String sql,Object ... args)
    {
        Connection conn=JdbcUtils.getConnection();
        try {
            queryRunner.query(conn,sql,new ScalarHandler(),args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(conn);
        }
        return null;
    }
}
